package com.yang.framework.disruptor;


import com.lmax.disruptor.RingBuffer;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;

/**
 * 支付通知消息的生产者
 *
 * @author 杨 强
 * @package com.yang.framework.disruptor
 * @createTime 2023-09-10 15:03
 */
@Component
public class PayNoticeEventProducer {

    @Resource
    private RingBuffer<PayNoticeEvent> payNoticeRingBuffer;

    /**
     * onData用来发布事件，每调用一次就是发布一次事件
     * @param event: 通过事件的方式传递给消费者的数据
     */
    public void onData(PayNoticeEvent event){
        // 1 可以把RingBuffer看作一个事件队列,next就是下一个事件槽
        long sequence = payNoticeRingBuffer.next();
        try {
            // 2 取出一个空的事件用于填充,获取该序号对应的事件对象
            PayNoticeEvent payNoticeEvent = payNoticeRingBuffer.get(sequence);
            // 3 获取要通过事件传递的业务数据
            BeanUtils.copyProperties(event, payNoticeEvent);
        }finally {
            // 4 发布事件
            payNoticeRingBuffer.publish(sequence);
        }
    }

}
